package com.med.common;

import com.med.enums.ResponseCode;
import lombok.Data;


@Data
public class ResponseDTO<T> {
    // 状态码
    private final int code;
    // 状态信息
    private final String message;
    // 响应数据
    private final T data;

    /**
     * 私有化构造方法，防止外部直接创建
     *
     * @param responseCode 响应状态码枚举
     * @param data         响应数据
     */
    private ResponseDTO(ResponseCode responseCode, T data) {
        this.code = responseCode.getCode();
        this.message = responseCode.getMessage();
        this.data = data;
    }

    /**
     * 成功响应，带有数据
     *
     * @param data 相应数据
     * @param <T>  响应的数据类型
     * @return ResponseDTO对象
     */
    public static <T> ResponseDTO<T> success(T data) {
        return new ResponseDTO<T>(ResponseCode.SUCCESS, data);
    }

    /**
     * 成功响应，不带数据
     *
     * @param <T> 响应数据类型
     * @return ResponseDTO对象
     */
    public static <T> ResponseDTO<T> success() {
        return success(null);
    }

    /**
     * 错误响应，不带数据
     *
     * @param responseCode 错误状态码
     * @param <T>          响应数据类型
     * @return ResponseDTO对象
     */
    public static <T> ResponseDTO<T> error(ResponseCode responseCode) {
        return new ResponseDTO<T>(responseCode, null);
    }

    /**
     * 错误响应，带有错误数据
     *
     * @param responseCode 错误状态码
     * @param data         错误数据
     * @param <T>          响应数据类型
     * @return ResponseDTO对象
     */
    public static <T> ResponseDTO<T> error(ResponseCode responseCode, T data) {
        return new ResponseDTO<T>(responseCode, data);
    }
}
